package org.javahispano.javacup.tacticas_aceptadas.jpautom.org.javahispano.javacup.tacticas.pitufos;
import java.util.Vector;
import org.javahispano.javacup.modelo.Constantes;
import org.javahispano.javacup.modelo.SituacionPartido;

public class Historia {
	private Vector<Campo> hcampo;

	public Historia() {
		hcampo=new Vector<Campo>();
	}

	public void update(Campo c) {
		hcampo.add((Campo)c.clone());
	}


	public void update(SituacionPartido sp) {
		Campo c=new Campo();
		if (getCampo(0)!=null) {
			c.setInfo(getCampo(0).getInfo());
			c.setUltimoGolpear(getCampo(0).getUltimoGolpear());
			c.setDesempate(getCampo(0).getDesempate());
		}
		else {
			c.setInfo(new Info(sp));
			c.setUltimoGolpear(-1);
			c.setDesempate(0.5);
		}

		c.setTiempo(sp.iteracion());
		c.setGoles1(sp.golesPropios());
		c.setGoles2(sp.golesRival());
		for (int i=0; i<11; i++) {
			c.getJugador(i, 0).getPos().setLocation(sp.misJugadores()[i].getX(), sp.misJugadores()[i].getY());
			c.getJugador(i, 1).getPos().setLocation(sp.rivales()[i].getX(), sp.rivales()[i].getY());
			c.getJugador(i, 0).setTSinRematar(sp.iteracionesParaRematar()[i]);
			c.getJugador(i, 1).setTSinRematar(sp.iteracionesParaRematarRival()[i]);
			if (sp.iteracionesParaRematar()[i]==Constantes.ITERACIONES_GOLPEAR_BALON) {
				c.setUltimoGolpear(i);
			}
			else if (sp.iteracionesParaRematarRival()[i]==Constantes.ITERACIONES_GOLPEAR_BALON) {
				c.setUltimoGolpear(11+i);
			}
		}
		if (c.getTiempo()>0 && c.getUltimoGolpear()>=0) {
			c.setDesempate((c.getDesempate()*(c.getTiempo()-1)+(c.getUltimoGolpear()/11==0?1:0))/c.getTiempo());
		}
//		Util.log("t: %d ultGolp: %d desempate: %.2f\n", c.getTiempo(), c.getUltimoGolpear(), c.getDesempate());

		//
		// Determina el estado de la bola
		//
		if (hcampo.size()==0 || sp.saco() || sp.sacaRival()) {
			// primera iteracion
			c.getBola().getPos().setLocation(sp.balon().getX(), sp.balon().getY(), sp.alturaBalon());
			c.getBola().getMov().setVxyz(0, 0, 0);
		}
		else {
			Campo.Bola b1=(Campo.Bola)getCampo(0).getBola().clone();
			Campo.Bola b0=(Campo.Bola)b1.clone();
			Util.futuroBola(b0, 1);
			Pos p=new Pos();
			p.setLocation(sp.balon().getX(), sp.balon().getY(), sp.alturaBalon());
//			Util.log("----\npos actual p:%s\n", p);
//			Util.log("pos anterior b1:%s\n", b1);
//			Util.log("pos prevista b0:%s\n", b0);
			if (p.distanceSq(b0.getPos())>Util.EPSILON) {
				// comprueba si alguien ha tocado la bola
				boolean bolaGolpeada=false;
				for (int i=0; i<11; i++) {
					if (sp.iteracionesParaRematar()[i]==Constantes.ITERACIONES_GOLPEAR_BALON 
						|| sp.iteracionesParaRematarRival()[i]==Constantes.ITERACIONES_GOLPEAR_BALON) {
						bolaGolpeada=true;
					}
				}

				b1.getMov().setVxyz(
					sp.balon().getX()-b1.getPos().getX(),
					sp.balon().getY()-b1.getPos().getY(),
					sp.alturaBalon()-b1.getPos().getZ());
				if (bolaGolpeada){
					b1.getMov().setVz(sp.alturaBalon());
					b1.getPos().z=0.0;
				}
//				Util.log("b ant corregida b1:%s\n", b1);
				Util.futuroBola(b1, 1);
//				Util.log("bola actual b1:%s\n", b1);
				c.getBola().getPos().set(p);
				c.getBola().getMov().set(b1.getMov());
			}
			else {
				// nadie ha tocado la bola
				c.getBola().getPos().set(b0.getPos());
				c.getBola().getMov().set(b0.getMov());
			}
		}
		update(c);
	}


	public Campo getCampo(int t) {
		if (hcampo.size()==0) return null;
		if (t>=hcampo.size()) return hcampo.elementAt(0);
		if (t<0) return hcampo.lastElement();
		return hcampo.elementAt(hcampo.size()-1-t);
	}
}
